# Disponivel no pacote de programas como: grafodin.py
import networkx as NX
import threading,random, pylab as P

class Contagio:
    def __init__(self,nome):
        self.nome = nome
        self.doente = 0
        self.transmite()
    def transmite(self):
        if G.doentes == G.order():
            return
        for alvo in random.sample(G.nodes(),3):
            if not alvo.doente:
                G.add_edge((self,alvo))
                print "%s infectou %s"%(self.nome, alvo.nome)
                t = threading.Thread(target=alvo.contraiu())
                t.start()
    def contraiu(self):
        self.doente +=1
        G.doentes +=1
        self.transmite()

G = NX.XDiGraph()
G.doentes = 0
nos = [Contagio(n) for n in xrange(80)]
G.add_nodes_from(nos) 
caso_indice = G.nodes()[0]
caso_indice.contraiu()
print "usamos %s das arestas possiveis"%(NX.density(G))
print NX.degree_histogram(G), G.doentes
nomes = dict([(no,no.nome) for no in G.nodes()])
NX.draw(G,labels=nomes, alpha=0.7,width=2, style='dotted', node_size=450, font_size=14)
P.savefig('contagio.png',dpi=400)
P.show()
